home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Software Vault: The Gold Collection
/
Software Vault - The Gold Collection (American Databankers) (1993).ISO
/
cdr26
/
netprog.zip
/
NETPROG.TAR
/
tftp
/
maincli.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-12-17
|
2KB
|
112 lines
/*
* tftp - Trivial File Transfer Program. Client side.
*
* See RFC 783 for details. Also see the "Requirements for Internet Hosts"
* RFC for additional explanations and clarifications.
*/
#include "defs.h"
#include <signal.h>
main(argc, argv)
int argc;
char **argv;
{
register int i;
register char *s;
register FILE *fp;
pname = argv[0];
while (--argc > 0 && (*++argv)[0] == '-')
for (s = argv[0]+1; *s != '\0'; s++)
switch (*s) {
case 'h': /* specify host name */
if (--argc <= 0)
err_quit("-h requires another argument");
strcpy(hostname, *++argv);
break;
case 't':
traceflag = 1;
break;
case 'v':
verboseflag = 1;
break;
default:
err_quit("unknown command line option: %c", *s);
}
/*
* For each filename argument, execute the tftp commands in
* that file. If no filename arguments were specified on the
* command line, we process the standard input by default.
*/
i = 0;
fp = stdin;
do {
if (argc > 0 && (fp = fopen(argv[i], "r")) == NULL) {
err_sys("%s: can't open %s for reading", argv[i]);
}
mainloop(fp); /* process a given file */
} while (++i < argc);
exit(0);
}
mainloop(fp)
FILE *fp;
{
int sig_intr();
if (signal(SIGINT, SIG_IGN) != SIG_IGN)
signal(SIGINT, sig_intr);
/*
* Main loop. Read a command and execute it.
* This loop is terminated by a "quit" command, or an
* end-of-file on the command stream.
*/
if (setjmp(jmp_mainloop) < 0) {
err_ret("Timeout");
}
if (interactive)
printf("%s", prompt);
while (getline(fp)) {
if (gettoken(command) != NULL)
docmd(command);
if (interactive)
printf("%s", prompt);
}
}
/*
* INTR signal handler. Just return to the main loop above.
* In case we were waiting for a read to complete, turn off any possible
* alarm clock interrupts.
*
* Note that with TFTP, if the client aborts a file transfer (such as with
* the interrupt signal), the server is not notified. The protocol counts
* on the server eventually timing out and exiting.
*/
int
sig_intr()
{
signal(SIGALRM, SIG_IGN); /* first ignore the signal */
alarm(0); /* then assure alarm is off */
longjmp(jmp_mainloop, 1);
/* NOTREACHED */
}